/*****************************************************************************************
 * ETS
 * 
 * Cours:		LOG121
 * Session:		A2013
 * Groupe:		04
 * Projet:		Laboratoire #4
 * Etudiants:	Frederic-Simon Mimeault
 * 				Francisco Felipe Quilodran
 * 				Guillaume Longtin
 * 				William Proulx
 * 
 * Professeur:	Francis Cardinal
 * 
 * Fichier:		VignetteVue.java
 * Description:
 * 		
 * 
 * Date de creation:	2013-11-23
 * Date dern. modif.:	2013-12-06
 * ****************************************************************************************
 * Historique des modifications
 * ****************************************************************************************
 * 2013-11-23 Version initiale
 *****************************************************************************************/

package vue;

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;
import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage;
import java.util.Observable;
import java.util.Observer;

import javax.swing.JFrame;
import javax.swing.JPanel;

import modele.Figure;

/**
 * Classe concrete qui permettra d'afficher une image de taille reduite non-modifiable.
 * @author Francisco Quilodran
 */
public class VignetteVue extends JFrame implements Observer {

	public static final double SCALE = 0.175;
	private Figure figure;
	private BufferedImage imgCopy;
	private static final long serialVersionUID = -1382917082738776658L;
	
	/**
	 * Constructeur de Vignette 
	 * @param figure référence de la figure qui est affiché
	 */
	public VignetteVue(Figure figure) {
		
		super();
		figure.addObserver(this);
		this.figure=figure;
		this.scaleImage(SCALE);
		
		JPanel panel = new JPanel() {
			
			@Override
			public void paint(Graphics g) {
				super.paint(g);

				((Graphics2D) g).drawImage(imgCopy,null,0,0);
			     g.dispose();
			     
			}
		};
		
		this.add(panel);
		this.setPreferredSize(new Dimension((int)(imgCopy.getWidth() * SCALE),(int)(imgCopy.getHeight() * SCALE)));
		this.setResizable(false);
		this.pack();
		this.setVisible(true);
		this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
		this.repaint();
		
	}
	
	@Override
	public void paintComponents(Graphics g) {
	
		super.paintComponents(g);
		
	}

	@Override
	public void update(Observable o, Object arg) {
		
		this.scaleImage(SCALE);
		this.repaint();	
		this.setPreferredSize(new Dimension((int)(imgCopy.getWidth() * SCALE),(int)(imgCopy.getHeight() * SCALE)));
		this.pack();
	}
	
	/**
	 * Méthode qui ajuste une image selon un echelle de 0.1 à 1.0 (10% à 100%) 
	 * @param echelle 
	 */
	private void scaleImage(double echelle) {
		
		AffineTransform at = AffineTransform.getScaleInstance(echelle, echelle);
		AffineTransformOp scaleOp = new AffineTransformOp(at, AffineTransformOp.TYPE_BILINEAR);
		imgCopy = new BufferedImage(this.figure.getImg().getWidth(), figure.getImg().getHeight(), BufferedImage.TYPE_3BYTE_BGR);
		scaleOp.filter(this.figure.getImg(), imgCopy);
		
	}
}
